#!/bin/bash
#
# SrvrPowerCtrl plugin helper script for linux.
#
# This script will set the system's RTC to wake the system up in advance of a programmed SqueezeCenter alarm.
#
# It attempts to accommodate hardware clocks set either to UTC or local time. (Thnx to rickwookie.)
#
#
# Copy this script to /usr/local/sbin/scwakeup.sh: cp ./scwakeup.sh /usr/local/sbin/scwakeup.sh
#
# Give root only permissions: chown root:root /usr/local/sbin/scwakeup.sh
#
# Make it executable: chmod a+x /usr/local/sbin/scwakeup.sh
#
# Test it:  sudo /usr/local/sbin/scwakeup.sh 1234567890
#
# View the log: cat /var/log/squeezecenter/srvrpowerctrl.log
#
# See http://www.mythtv.org/wiki/index.php/ACPI_Wakeup
# for apci wakeup troubleshooting...
#

log_file=/var/log/SBSVERSION/srvrpowerctrl.log

#Try to figure out if RTC is set to UTC or local time..
rtcStatus=`/sbin/hwclock --debug --directisa`
if [[ "$rtcStatus" =~ "Hardware clock is on UTC time" ]]; then
	RTCisUTC=1
else
	RTCisUTC=0
fi

#Get the wakeup time from the cmd line arg..
waketimeUTC=$1
waketimeUTCp=`/bin/date -u -d "1970-01-01 $waketimeUTC seconds" +"%Y-%m-%d %H:%M:%S"`

#Compute the local time offset in seconds from UTC..
localOffsetStr=`/bin/date +%z`
#Is our offset from UTC positive (east) or negative (west)?
if [[ "$localOffsetStr" =~ "\+" ]]; then
	IsWest=0
else
	IsWest=1
fi

localOffsetHours="${localOffsetStr:1:2}"
localOffsetMinutes="${localOffsetStr:3:2}"
localOffsetSeconds=$(($localOffsetHours*3600+$localOffsetMinutes*60))
if [[ $IsWest>0 ]]; then
	localOffsetSeconds=-$localOffsetSeconds
fi

#Compute the local wakeup time..
waketimeLocal=$(($waketimeUTC+$localOffsetSeconds))
waketimeLocalp=`/bin/date -u -d "1970-01-01 $waketimeLocal seconds" +"%Y-%m-%d %H:%M:%S"`


#Which type of RTC interface is present?

if [[ -f /sys/class/rtc/rtc0/wakealarm ]]; then
	if [[ $RTCisUTC>0 ]]; then
		#Kernels > 2.6.22 and higher use /sys/class/rtc/rtc0/wakealarm 
		/bin/echo "Setting /sys/class/rtc/rtc0/wakealarm to $waketimeUTC ($waketimeUTCp)" >>$log_file
		/bin/echo 0 >/sys/class/rtc/rtc0/wakealarm
		/bin/echo $waketimeUTC >/sys/class/rtc/rtc0/wakealarm
	else
		/bin/echo "Setting /sys/class/rtc/rtc0/wakealarm to $waketimeLocal ($waketimeLocalp)" >>$log_file
		/bin/echo 0 >/sys/class/rtc/rtc0/wakealarm
		/bin/echo $waketimeLocal >/sys/class/rtc/rtc0/wakealarm
	fi

elif [[ -f /proc/acpi/alarm ]]; then
	if [[ $RTCisUTC>0 ]]; 	then
		#Kernels < 2.6.21 and lower use /proc/acpi/alarm
		/bin/echo "Setting /proc/acpi/alarm to $waketimeUTCp" >>$log_file
		/bin/echo $waketimeUTCp >/proc/acpi/alarm
	else
		/bin/echo "Setting /proc/acpi/alarm to $waketimeLocalp" >>$log_file
		/bin/echo $waketimeLocalp >/proc/acpi/alarm
	fi
else
	/bin/echo "SrvrPowerCtrl does not support RTC wakeup on this system!" >>$log_file
fi
